約 1,894,284 件
https://w.atwiki.jp/lucier/pages/42.html
こんな感じでパンくずを表示させる。 画面イメージ /data/class_extends/helper_extends/SC_Helper_DB_EX.php functionを2つ追加。 ?phprequire_once(CLASS_PATH . "helper/SC_Helper_DB.php"); /** * DB関連のヘルパークラス(拡張). * * LC_Helper_DB をカスタマイズする場合はこのクラスを編集する. */class SC_Helper_DB_Ex extends SC_Helper_DB { /** * 2009.05.07 パンくずリスト表示機能追加 **/ function sfGetTopicPath($category_id) { // 商品が属するカテゴリIDを縦に取得 $objQuery = new SC_Query(); $arrCatID = $this- sfGetParents($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id); $TopicPath = " "; // カテゴリー名称を取得 foreach($arrCatID as $key = $val){ $sql = "SELECT category_name FROM dtb_category WHERE category_id = ?"; $arrVal = array($val); $CatName = $objQuery- getOne($sql, $arrVal); if($val != $category_id){ $TopicPath .= a href="./list.php?category_id = .$val. " . $CatName . /a ; } else { $TopicPath .= $CatName; } } return $TopicPath; } /** * 2009.05.07 パンくずリスト表示機能追加 **/ function sfGetTopicPath2($category_id) { // 商品が属するカテゴリIDを縦に取得 $objQuery = new SC_Query(); $arrCatID = $this- sfGetParents($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id); $TopicPath = " "; // カテゴリー名称を取得 foreach($arrCatID as $key = $val){ $sql = "SELECT category_name FROM dtb_category WHERE category_id = ?"; $arrVal = array($val); $CatName = $objQuery- getOne($sql, $arrVal); $TopicPath .= a href="./list.php?category_id = .$val. " . $CatName . /a ; } return $TopicPath; }}? /data/class/pages/products/LC_Page_Products_List.php process()の中の// タイトル編集部分に以下を追加。 // タイトル編集 $tpl_subtitle = ""; if ($_GET[ mode ] == search ) { $tpl_subtitle = "検索結果"; } elseif (empty($arrCategory_id[0])) { $tpl_subtitle = "全商品"; } else { $arrFirstCat = $objDb- sfGetFirstCat($arrCategory_id[0]); $tpl_subtitle = $arrFirstCat[ name ]; // 2009.05.07 @パンくずリスト設置機能追加 $TopicPath = $objDb- sfGetTopicPath($arrCategory_id[0]); $this- tpl_topicpath = $TopicPath; } /data/class/pages/products/LC_Page_Products_Detail.php process()の中に以下を追加。 // サブタイトルを取得 $arrCategory_id = $objDb- sfGetCategoryId($arrRet[0][ product_id ], $status); $arrFirstCat = $objDb- sfGetFirstCat($arrCategory_id[0]); $this- tpl_subtitle = $arrFirstCat[ name ]; // 2009.05.07 @パンくずリスト表示機能追加 $arrTopicPath = $objDb- sfGetTopicPath2($arrCategory_id[0]); $this- tpl_topicpath = $arrTopicPath; // 関連カテゴリを取得 $this- arrRelativeCat = $objDb- sfGetMultiCatTree($tmp_id); 最後に表示するテンプレート(この場合はメインテンプレート)に表示できるように記述。 /data/Smarty/templates/default/site_main.tpl !--{* ▼HEADER *}-- !--{if $arrPageLayout.header_chk != 2}-- !--{include file= $header_tpl}-- !--{/if}-- !--{* ▲HEADER *}-- !--{* ▼CONTENTS *}-- div id="container" !--{* ▼パンくずリスト @2009.05.09追加 *}-- !--{if $tpl_topicpath != ""}-- a href=" !--{$smarty.const.SITE_URL}-- index.php" TopPage /a !--{$tpl_topicpath}-- !--{$arrProduct.name|escape}-- !--{/if}-- !--{* ▲パンくずリスト *}--
https://w.atwiki.jp/lucier/pages/45.html
ショップ運営の際にすべてのユーザが管理者権限で管理画面を操作できてしまうと セキュリティ上問題になるため、権限を制御したユーザーを作成します。 ※このカスタマイズではURL直打ちをされてしまうと、ページを見ることができます。(要対処) ※非表示対象のメニューが初期表示メニューの場合、ページは表示されてしまいます。(要対処) 管理者権限の追加 システム設定>マスタデータ管理より mtb_authorityを選択 初期状態では ID 0 値:管理者 のみが登録されている。 これに権限を追加する。 たとえば、閲覧のみの権限を作成する ID 1 値:ビューアー とか。 ユーザを作成する システム設定>メンバー管理より、新規メンバーを作成する。 閲覧者を追加してみる。 画面制御を行う 実際にユーザを作成しただけでは制御できないので、 画面にて権限IDを使用して制御する。 管理画面の左メニューを制御してみる。 たとえば、管理者以外はシステム設定のメンバー管理より下の項目を表示しないようにする。 /data/Smarty/templates/default/admin/system/subnavi.tpl を編集する。 管理サイトではログイン情報をセッションで保持しているので、 セッションから権限IDを取得し、判断する。 管理者IDは0に設定しているので、権限ID != 0の場合は表示しないようにすればよい。 Line24~以下のように書き換える。 table width="141" border="0" cellspacing="0" cellpadding="0" summary=" " id="menu_navi" !--ナビ-- tr td class= !--{if $tpl_subno != index }-- "navi" !--{else}-- "navi-on" !--{/if}-- a href="./index.php" onMouseOver="naviStyleChange( index , #a5a5a5 )" !--{if $tpl_subno != index }-- onMouseOut="naviStyleChange( index , #636469 )" !--{/if}-- id="index" img src=" !--{$TPL_DIR}-- img/contents/icon.jpg" width="15" height="9" alt="" border="0" span class="navi_text" メンバー管理 /span /a /td /tr tr td img src=" !--{$TPL_DIR}-- img/contents/navi_line.gif" width="140" height="2" alt="" /td /tr !--{if $smarty.session.authority == 0}-- tr td class= !--{if $tpl_subno != bkup }-- "navi" !--{else}-- "navi-on" !--{/if}-- a href="./bkup.php" onMouseOver="naviStyleChange( bkup , #a5a5a5 )" !--{if $tpl_subno != bkup }-- onMouseOut="naviStyleChange( bkup , #636469 )" !--{/if}-- id="bkup" img src=" !--{$TPL_DIR}-- img/contents/icon.jpg" width="15" height="9" alt="" border="0" span class="navi_text" バックアップ管理 /span /a /td /tr tr td img src=" !--{$TPL_DIR}-- img/contents/navi_line.gif" width="140" height="2" alt="" /td /tr tr td class= !--{if $tpl_subno != parameter }-- "navi" !--{else}-- "navi-on" !--{/if}-- a href="./parameter.php" onMouseOver="naviStyleChange( parameter , #a5a5a5 )" !--{if $tpl_subno != parameter }-- onMouseOut="naviStyleChange( parameter , #636469 )" !--{/if}-- id="parameter" img src=" !--{$TPL_DIR}-- img/contents/icon.jpg" width="15" height="9" alt="" border="0" span class="navi_text" パラメータ設定 /span /a /td /tr tr td img src=" !--{$TPL_DIR}-- img/contents/navi_line.gif" width="140" height="2" alt="" /td /tr tr td class= !--{if $tpl_subno != masterdata }-- "navi" !--{else}-- "navi-on" !--{/if}-- a href="./masterdata.php" onMouseOver="naviStyleChange( masterdata , #a5a5a5 )" !--{if $tpl_subno != masterdata }-- onMouseOut="naviStyleChange( masterdata , #636469 )" !--{/if}-- id="masterdata" img src=" !--{$TPL_DIR}-- img/contents/icon.jpg" width="15" height="9" alt="" border="0" span class="navi_text" マスタデータ管理 /span /a /td /tr tr td img src=" !--{$TPL_DIR}-- img/contents/navi_line.gif" width="140" height="2" alt="" /td /tr tr td class= !--{if $tpl_subno != system }-- "navi" !--{else}-- "navi-on" !--{/if}-- a href="./system.php" onMouseOver="naviStyleChange( system , #a5a5a5 )" !--{if $tpl_subno != system }-- onMouseOut="naviStyleChange( system , #636469 )" !--{/if}-- id="system" img src=" !--{$TPL_DIR}-- img/contents/icon.jpg" width="15" height="9" alt="" border="0" span class="navi_text" システム情報 /span /a /td /tr tr td img src=" !--{$TPL_DIR}-- img/contents/navi_line.gif" width="140" height="2" alt="" /td /tr !--{/if}-- !--ナビ-- /table 閲覧者でログインすると。。。 こんな感じです。
https://w.atwiki.jp/lucier/pages/49.html
カレンダーの休日設定を細かくできるようにする。 1)毎週○曜日休業 の設定 2)第□の○曜日休業 の設定 3)上記該当日でも、特別に営業する日 設定ファイルで定休日を細かく設定する。 できあがりはこんな感じ。 CSSを新規作成する。 /html/user_data/packages/default/css/add.css @charset "utf-8"; /* カレンダー----------------------------------------------- */#block-calendar .sun {background #FFEECC;color #E04A00;} #block-calendar .sat {background #e6e6fa;color #6495ed;} #block-calendar .off {background #ffc0cb;color #ff6347;font-weight bolder;} /html/user_data/packages/default/css/import.css に作成したadd.cssを追加する。 @charset "utf-8"; @import url("./main.css");@import url("./index.css");@import url("./products.css");@import url("./under.css");@import url("./under02.css");@import url("./mypage.css");@import url("./window.css");@import url("./add.css"); /data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Calendar.php を修正。 ?php$current_dir = realpath(dirname(__FILE__));define( CALENDAR_ROOT , DATA_PATH. module/Calendar .DIRECTORY_SEPARATOR);require_once($current_dir . "/../../../../module/Calendar/Month/Weekdays.php");require_once(CLASS_PATH . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc.php"); /** * Calendar のページクラス. * * @package Page * @author LOCKON CO.,LTD. * @version $ $ */class LC_Page_FrontParts_Bloc_Calendar extends LC_Page_FrontParts_Bloc { /** * Page を初期化する. * * @return void */ function init() { parent init(); $bloc_file = calendar.tpl ; $this- setTplMainpage($bloc_file); // カレンダーの追加初期設定 @2009.05.12 require_once(DATA_PATH. calendar_conf.php ); $this- setHoliday_w = $cal_holiday; $this- setHoliday_open = $cal_open; $this- setHoliday_wnum = $cal_w_num; } /** * Page のプロセス. * * @return void */ function process() { if (defined("MOBILE_SITE") MOBILE_SITE) { $objView = new SC_MobileView(); } else { $objView = new SC_SiteView(); } // 定休日取得取得 $this- arrHoliday = $this- lfGetHoliday(); // カレンダーデータ取得 $this- arrCalendar = $this- lfGetCalendar(2); $objView- assignobj($this); $objView- display($this- tpl_mainpage); } /** * モバイルページを初期化する. * * @return void */ function mobileInit() { $this- tpl_mainpage = MOBILE_TEMPLATE_DIR . "frontparts/" . BLOC_DIR . best5.tpl ; } /** * Page のプロセス(モバイル). * * @return void */ function mobileProcess() { $this- process(); } /** * デストラクタ. * * @return void */ function destroy() { parent destroy(); } // カレンダー情報取得 function lfGetCalendar($disp_month = 1){ for ($j = 0; $j = $disp_month-1; ++$j) { $year = date( Y ); $month = date( n ) + $j; if ($month 12) { $month = $month%12; $year = $year + $month%12; } $Month = new Calendar_Month_Weekdays($year, $month, 0); $Month- build(); $i = 0; while ($Day = $Month- fetch()) { if ($month == $Day- month) { $arrCalendar[$j][$i][ in_month ] = true; } else { $arrCalendar[$j][$i][ in_month ] = false; } $arrCalendar[$j][$i][ first ] = $Day- first; $arrCalendar[$j][$i][ last ] = $Day- last; $arrCalendar[$j][$i][ empty ] = $Day- empty; $arrCalendar[$j][$i][ year ] = $year; $arrCalendar[$j][$i][ month ] = $month; $arrCalendar[$j][$i][ day ] = $Day- day; if ($this- lfCheckHoliday($month, $Day- day) || $Day- first || $Day- last) { $arrCalendar[$j][$i][ holiday ] = true; } else { $arrCalendar[$j][$i][ holiday ] = false; } ++$i; } } return $arrCalendar; } // 休日取得 function lfGetHoliday() { $objQuery = new SC_Query(); $objQuery- setorder("rank DESC"); $where = "del_flg 1"; $arrRet = $objQuery- select("month, day", "dtb_holiday", $where); foreach ($arrRet AS $key= $val) { $arrHoliday[$val[ month ]][] = $val[ day ]; } return $arrHoliday; } // 休日チェック function lfCheckHoliday($month, $day) { if (!empty($this- arrHoliday[$month])) { if (in_array($day, $this- arrHoliday[$month])) { return true; } } return false; } /*** * カレンダー情報取得 * @2009.05.12追加 ***/ function lfGetCalendar($disp_month = 1) { for($j = 0; $j = $disp_month-1; ++$j){ $year = date( Y ); $month = date( n ) + $j; if($month 12){ $month = $month%12; $year = $year + $month; } $Month = new Calendar_Month_Weekdays($year, $month, 0); $Month- build(); $i = 0; $z = 1; // 週 $w_count = array(0,0,0,0,0,0,0); // 曜日毎のカウント while($Day = $Month- fetch()){ if($month == $Day- month){ $arrCalendar[$j][$i][ in_month ] = true; } else { $arrCalendar[$j][$i][ in_month ] = false; } $arrCalendar[$j][$i][ first ] = $Day- first; $arrCalendar[$j][$i][ last ] = $Day- last; $arrCalendar[$j][$i][ empty ] = $Day- empty; $arrCalendar[$j][$i][ year ] = $year; $arrCalendar[$j][$i][ month ] = $month; $arrCalendar[$j][$i][ day ] = $Day- day; // 曜日を求めたあと、曜日の出現回数をカウント $w_day = date( w , mktime(0,0,0,$arrCalendar[$j][$i][ month ], $arrCalendar[$j][$i][ day ], $arrCalendar[$j][$i][ year ])); if($arrCalendar[$j][$i][ in_month ]){ $w_count[$w_day] ++; } // 第何週かのカウント if($Day- last){ $z ++; } // 1=日曜日、2=土曜日、3=休業日、4=その他 if($this- lfCheckHoliday($month, $Day- day)){ $arrCalendar[$j][$i][ holiday ] = 3; } elseif($Day- first){ $arrCalendar[$j][$i][ holiday ] = 1; } elseif($Day- last){ $arrCalendar[$j][$i][ holiday ] = 2; } else { $arrCalendar[$j][$i][ holiday ] = 4; } // 毎週○○曜日が休みの設定をオーバーライド foreach($this- setHoliday_w as $chk){ if($w_day == $chk){ $arrCalendar[$j][$i][ holiday ] = 3; } } // 第○△曜日が休みの設定をオーバーライド if ($this- setHoliday_wnum[$w_count[$w_day]][$w_day]){ $arrCalendar[$j][$i][ holiday ] = 3; } // 決まった休みでも特別に営業する場合などをオーバーライド foreach($this- setHoliday_open as $chk){ $w_day = $arrCalendar[$j][$i][ year ] . "-" . $arrCalendar[$j][$i][ month ] . "-" . $arrCalendar[$j][$i][ day ]; if($w_day == $chk){ $arrCalendar[$j][$i][ holiday ] = 4; } } ++$i; } } return $arrCalendar; }}? 管理画面からブロックの編集を行う。 管理画面 デザイン管理 ブロック編集 カレンダー 以下の通りに書き換える pre code !--▼カレンダーここから-- h2 /h2 div id="block-calendar" !--{section name=num loop=$arrCalendar}-- !--{assign var=arrCal value=`$arrCalendar[num]`}-- !--{section name=cnt loop=$arrCal}-- !--{if $smarty.section.cnt.first}-- table caption !--{$arrCal[cnt].year}-- 年 !--{$arrCal[cnt].month}-- 月の定休日 /caption thead tr th 日 /th th 月 /th th 火 /th th 水 /th th 木 /th th 金 /th th 土 /th /tr /thead !--{/if}-- !--{if $arrCal[cnt].first}-- tr !--{/if}-- !--{if !$arrCal[cnt].in_month}-- td /td !--{elseif $arrCal[cnt].holiday == 1}-- td class="sun" !--{$arrCal[cnt].day}-- /td !--{elseif $arrCal[cnt].holiday == 2}-- td class="sat" !--{$arrCal[cnt].day}-- /td !--{elseif $arrCal[cnt].holiday == 3}-- td class="off" !--{$arrCal[cnt].day}-- /td !--{else}-- td !--{$arrCal[cnt].day}-- /td !--{/if}-- !--{if $arrCal[cnt].last}-- /tr !--{/if}-- !--{/section}-- !--{if $smarty.section.cnt.last}-- /table !--{/if}-- !--{/section}-- /div !--▲カレンダーここまで-- /code /pre 休日を決める設定ファイルを追加する。 /data/calendar_conf.php pre code ?php // 毎週○○曜日休みの設定。カンマで区切ってください。//$cal_holiday = array(3,4); // 0=日曜~ 6=土曜$cal_holiday = array(3); // 0=日曜~ 6=土曜 // 第○▲曜日の設定// $cal_w_num[第○][曜日0~6]// 例)$cal_w_num[1][2]; 第1火曜日// 必要数だけ追加してください//$cal_w_num[2][2] = true;$cal_w_num[4][5] = true; // 営業日の設定。毎週休みを設定した場合などで、特別に営業する場合など。// カンマで区切ってください。$cal_open = array( 2009-5-22 , 2008-5-17 ,); ? /code /pre
https://w.atwiki.jp/lucier/pages/12.html
環境変数系の定数定義ファイル [root]/data/install.php define ( ECCUBE_INSTALL , ON ); define ( HTML_PATH , [root]/html/ ); define ( SITE_URL , [指定値] ); define ( SSL_URL , [指定値] ); define ( URL_DIR , [指定値] ); define ( DOMAIN_NAME , ); define ( DB_TYPE , mysql ); define ( DB_USER , eccube_db_user ); define ( DB_PASSWORD , [指定値] ); define ( DB_SERVER , 127.0.0.1 ); define ( DB_NAME , eccube_db ); define ( DB_PORT , ); define ( DATA_PATH , [root]/data/ ); define ( MOBILE_HTML_PATH , HTML_PATH . mobile/ ); define ( MOBILE_SITE_URL , SITE_URL . mobile/ ); define ( MOBILE_SSL_URL , SSL_URL . mobile/ ); define ( MOBILE_URL_DIR , URL_DIR . mobile/ ); ここを編集
https://w.atwiki.jp/lucier/pages/39.html
売上集計をリアルタイムでなく、バッチモードで行うとタイムアウトしないという ただのタイムアウト回避方法。 デフォルトはリアルタイム集計法。 リアルタイムで集計したいのもわかるけど。 データが大量だとタイムアウトが発生する。 商品別集計したときの画面イメージはこんな感じ。 ちなみに、リアルタイムは 1. 「月度で集計する」や「期間で集計する」ボタンが押されたときにその場で集計→集計データ格納→集計データ取得→表示、と行う方法。 バッチモードだと 2. あらかじめ売上データを集計しておき、「月度で集計する」や「期間で集計する」ボタンが押されたときには、すでに集計して格納済みのデータを取得→表示、と行う方法。 グラフ表示も同じロジックを通るため、これまたタイムアウトで表示できなかったり。 というわけで。 先にバッチモードで集計しておいたデータを表示するようにカスタマイズする。 パラメータの変更 まずは管理画面から 管理画面 システム設定 パラメータ設定 DAILY_BATCH_MODE をfalseからtrueに変更して登録する。 売上集計バッチの作成 次に、売上集計を定期的におこなうバッチを新規作成する。 /data/script/execute_batch_daily.php #!/usr/bin/env php ?php/** * デイリーバッチ起動スクリプト * @author y-nakajima */ require_once( dirname(__FILE__) . "/../install.php"); define( "CLASS_PATH", DATA_PATH . class/ ); define( "CLASS_EX_PATH", DATA_PATH . class_extends/ ); define( "CACHE_PATH" . DATA_PATH . cache/ ); require_once(CLASS_EX_PATH . "util_extends/GC_Utils_Ex.php"); require_once(CLASS_EX_PATH . "util_extends/SC_Utils_Ex.php"); require_once(CLASS_EX_PATH . "db_extends/SC_DB_MasterData_Ex.php"); require_once(CLASS_EX_PATH . "db_extends/SC_DB_DBFactory_Ex.php"); require_once(CLASS_PATH . "SC_DBConn.php"); require_once(CLASS_PATH . "SC_Query.php"); require_once(CLASS_PATH . "SC_SelectSql.php"); // アプリケーション初期化処理 $objInit = new SC_Initial_Ex(); $objInit- init(); $usage = USAGE php -f execute_batch_daily.php start term 集計期間を指定して売上集計します。 start集計開始日。何日前の売上から集計するか。1から365以内で指定。term集計対象期間。何日分の売上を集計をするか。1から365以内で指定。 例:昨日の売上を集計します。php -f execute_batch_daily.php 1 1 USAGE; if( $argc != 3){ echo($usage); exit(1); } $start = $argv[1]; $term = $argv[2]; if(!is_numeric( $start ) || !is_numeric( $term )){ echo($usage); exit(1); } $start = intval( $start ) $term = intval( $term ); if( $start 1 || $start 365 || $term 1 || $term 365){ echo($usage); exit(1); } if($term $start ){ echo($usage); exit(1); } $objBatch = new SC_Batch_Daily_Ex(); $objBatch- lfStartDailyTotal( $term, $start, true); ? バッチの修正 /data/class/batch/SC_Batch_Daily.php のlfStartDailyTotal()を修正する。 修正したのは3点。 キャンセル、削除になった受注詳細情報を削除しているのをコメントアウト。 最後のバッチ実行からLOAD_BATCH_PASS秒経過していないと実行しない。のログがうまく出力されないので修正。 集計のforループ /** * バッチ処理を実行する. * * @param mixed $argv コマンドライン引数 * @return void */ function execute($argv = "") { $term = 0; $start = 1;// 集計期間は、$start~$termの間となる。通常前日分から。 $command = false; // 集計対象期間の取得(指定日分さかのぼる) if (SC_Utils_Ex sfIsInt($argv[1]) $argv[1] = 365) { $term = $argv[1]; $command = true; } // 集計開始日 if (SC_Utils_Ex sfIsInt($argv[2]) $argv[2] = 365) { $start = $argv[2]; $command = true; } if($term 0) { // 集計の開始 $this- lfStartDailyTotal($term, $start, $command); } } // 集計の開始 function lfStartDailyTotal($term, $start, $command = false) { $now_time = time(); // グラフ画像の削除 $path = GRAPH_DIR . "*.png"; system ("rm -rf $path"); // 削除された受注データの受注詳細情報の削除 $objQuery = new SC_Query();/*EC-CUBE全体をgrepしてみたが、なぜ受注詳細情報だけを削除してしまうのか不明なので削除しないでおく。商品別集計もdel_flg=0でキャンセルステータスではない注文から集計してるので影響はなさそう。 $where = "order_id IN (SELECT order_id FROM dtb_order WHERE del_flg = 1)"; $objQuery- delete("dtb_order_detail", $where);*/ // 最後に更新された日付を取得 $ret = $objQuery- max("dtb_bat_order_daily", "create_date"); list($batch_last) = split("\.", $ret); $pass = $now_time - strtotime($batch_last); // 最後のバッチ実行からLOAD_BATCH_PASS秒経過していないと実行しない。 if($pass LOAD_BATCH_PASS) {// GC_Utils_Ex gfPrintLog("LAST BATCH " . $arrRet[0][ create_date ] . " " . $batch_pass . " - EXIT BATCH $batch_date"); $batch_next = date( "Y-m-d H i s", strtotime($batch_last) + LOAD_BATCH_PASS ); GC_Utils_Ex gfPrintLog("LAST BATCH " . $batch_last . " NEXT BATCH AFTER $batch_next - EXIT BATCH"); return; } // 集計// for ($i = $start; $i $term; $i++) { for ($i = $start; $k = 0; $i--, $k++ ) { // 基本時間から$i日分さかのぼる $tmp_time = $now_time - ($i * 24 * 3600); $batch_date = date("Y/m/d", $tmp_time); GC_Utils_Ex gfPrintLog("LOADING BATCH $batch_date"); $this- lfBatOrderDaily($tmp_time); $this- lfBatOrderDailyHour($tmp_time); $this- lfBatOrderAge($tmp_time); // タイムアウトを防ぐ SC_Utils_Ex sfFlush(); } } サーバへcronをセット。 サーバ(UNIX系OS)にcronをセットする。毎晩AM2 00に前日分の売上を集計するようにするには 以下のようにする。 $ crontab -e 0 2 * * * /usr/local/bin/php -f /path/to/eccube/data/script/execute_batch_daily.php 1 1 2 1 /dev/null リアルタイム集計でもタイムアウトを防ぐようにする SC_Batch_Daily lfRealTimeDailyTotal() のforループ中の最後に SC_Utils_Ex sfFlush(); を追加した。 // リアルタイムで集計を実施する。集計が終了しているレコードは実施しない。 /* $sdate YYYY-MM-DD hh mm ss形式の日付 $edate YYYY-MM-DD hh mm ss形式の日付 */ function lfRealTimeDailyTotal($sdate, $edate) { $pass = strtotime($edate) - strtotime($sdate); $loop = intval($pass / 86400); for($i = 0; $i = $loop; $i++) { $tmp_time = strtotime($sdate) + ($i * 86400); $batch_date = date("Y/m/d H i s", $tmp_time); $objQuery = new SC_Query(); $arrRet = $objQuery- select("order_date, create_date", "dtb_bat_order_daily", "order_date = ?", array($batch_date)); // すでにバッチ処理が終了しているかチェックする。 $count = count($arrRet); if( $count 0 ) { list($create_date) = split("\.", $arrRet[0][ create_date ]); list($order_date) = split("\.", $arrRet[0][ order_date ]); $create_time = strtotime($create_date); $order_time = strtotime($order_date); // オーダー開始日より一日以上後に集計されている場合は集計しなおさない if($order_time + 86400 $create_time || $tmp_time time()) { GC_Utils_Ex gfPrintLog("EXIT BATCH $batch_date $tmp_time" . " " . time()); continue; } } GC_Utils_Ex gfPrintLog("LOADING BATCH $batch_date"); $this- lfBatOrderDaily($tmp_time); $this- lfBatOrderDailyHour($tmp_time); $this- lfBatOrderAge($tmp_time); // タイムアウトを防ぐ 2009.05.01 追加 SC_Utils_Ex sfFlush(); } }
https://w.atwiki.jp/eccube2ch/
2ch - EC-CUBE 公式更新情報 2.0.1.zipファイルダウンロード開始 ダウンロード このサイトには2ch WebProg板の「 EC-CUBE 」スレに 質問を書くときの心得 、 WebProg 板住人による WebProg に関するよくある質問とその回答(FAQ) が置いてあります。 現在のスレッド - 【生き残れるか】EC-CUBE【2店舗目】 過去スレ - EC-CUBE バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、メールでお問い合わせください。 更新履歴 取得中です。
https://w.atwiki.jp/lucier/pages/47.html
売れ筋商品をランキング形式で表示させる。 売上の1~5位をランキング形式で表示。 こんな感じで。 では、さっそくカスタマイズ。 /html/frontparts/bloc/rankig.php インクルードしているファイルの名前を変更する ?phprequire_once(CLASS_EX_PATH . "page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Ranking_Ex.php"); $objPage = new LC_Page_FrontParts_Bloc_Ranking_Ex();register_shutdown_function(array($objPage, "destroy"));$objPage- init();$objPage- process();? /data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Ranking_Ex.php これまたインクルード先を変える。 ?phprequire_once(CLASS_PATH . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Ranking_Ex.php"); /** * ランキング のページクラス(拡張). * * LC_Page_FrontParts_Bloc_Ranking をカスタマイズする場合はこのクラスを編集する. */class LC_Page_FrontParts_Bloc_Ranking_Ex extends LC_Page_FrontParts_Bloc_Ranking { /** * Page を初期化する. * * @return void */ function init() { parent init(); } /** * Page のプロセス. * * @return void */ function process() { parent process(); } /** * デストラクタ. * * @return void */ function destroy() { parent destroy(); }}? /data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Ranking.php これはBest5をコピーしてロジックを編集する。 ?phprequire_once(CLASS_PATH . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc.php"); /** * ランキング のページクラス. */class LC_Page_FrontParts_Bloc_Ranking extends LC_Page_FrontParts_Bloc { /** * Page を初期化する. * * @return void */ function init() { parent init(); $bloc_file = ranking.tpl ; $this- setTplMainpage($bloc_file); } /** * Page のプロセス. * * @return void */ function process() { if (defined("MOBILE_SITE") MOBILE_SITE) { $objView = new SC_MobileView(); } else { $objView = new SC_SiteView(); } $objSiteInfo = $objView- objSiteInfo; // 基本情報を渡す $objSiteInfo = new SC_SiteInfo(); $this- arrInfo = $objSiteInfo- data; // ランキング表示 2009.05.08追加 $this- arrRanking = $this- lfGetRanking(); $objView- assignobj($this); objView- display($this- tpl_mainpage); //おすすめ商品表示 //$this- arrBestProducts = $this- lfGetRanking(); //$objView- assignobj($this); //objView- display($this- tpl_mainpage); } /** * モバイルページを初期化する. * * @return void */ function mobileInit() { $this- tpl_mainpage = MOBILE_TEMPLATE_DIR . "frontparts/" . BLOC_DIR . ranking.tpl ; } /** * Page のプロセス(モバイル). * * @return void */ function mobileProcess() { $this- process(); } /** * デストラクタ. * * @return void */ function destroy() { parent destroy(); } // ランキング検索 function lfGetRanking(){ $objQuery = new SC_Query(); $col = "T1.product_id, T1.product_name as name, T3.main_list_image, COUNT(*) as order_count"; $from = "dtb_order_detail AS T1 INNER JOIN dtb_order AS T2 ON T1.order_id = T2.order_id INNER JOIN dtb_products AS T3 ON T1.product_id = T3.product_id"; $objQuery- setgroupby("T1.product_id, T1.product_name, T3.main_list_image"); $objQuery- setorder("order_count DESC"); $objQuery- setlimit(5); return $objQuery- select($col, $from); }}? ブロックを追加する。 管理画面 デザイン管理 ブロック編集 ブロック名 ランキング ファイル名 ranking ※ランキング用の画像は別途用意する必要あり。 !--{if count($arrRanking) 0}-- h2 img src=" !--{$TPL_DIR}-- img/side/title_ranking.jpg" width="166" height="35" alt="ランキング" / /h2 div id="rankingarea" ul !--{foreach from=$arrRanking key=myId item=i}-- li a href=" !--{$smarty.const.DETAIL_P_HTML}-- !--{$i.product_id}-- " img src=" !--{$smarty.const.IMAGE_SAVE_URL|sfTrimURL}-- / !--{$i.main_list_image}-- " width="130px" alt=" !--{$i.name}-- " !--{assign var=rank value=$myId+1}-- span !--{$rank}-- 位: !--{$i.name}-- /span /a /li !--{/foreach}-- /ul /div !--{/if}-- CSS編集 ランキング用のCSSを追加 /html/user_data/packages/default/css/main.css /* ランキング @2009.05.08追加----------------------------------------------- */div#rankingarea { width 144px; padding 0 10px 10px 10px; border solid 1px #ccc;} div#rankingarea img { padding 0px; margin 2px auto; vertical-align bottom; display block;} div#rankingarea ul li { margin-top 6px;} div#rankingarea ul li span { clear both;} div#rankingarea ul li a { font-weight bold; color red; text-decoration none; display block;} div#rankingarea ul li a hover { color red; background-color #DDDDDD;} DBに値を追加する。 dtb_blocテーブルに先ほど追加した「ランキング」ブロックのデータが反映されているので、 そこのphp_pathを以下の値で更新する。 frontparts/bloc/ranking.php
https://w.atwiki.jp/lucier/pages/21.html
管理画面→デザイン管理→ヘッダー/フッター設定 この画面で編集が可能で、反映されるファイルは html/user_data/include/header.tpl html/user_data/include/footer.tpl
https://w.atwiki.jp/lucier/pages/43.html
商品送料(商品毎に送料を設定する機能)を実装する。 ※初期状態では、販売価格(単価)に入力した商品送料を上乗せする単純な仕様になっている。 さまざまな送料計算に対応できる拡張性をもたせるカスタマイズ。 /data/Smarty/templates/default/admin/products/confirm.tpl 在庫数の下に追加する。 tr td bgcolor="#f2f1ec" width="160" class="fs12n" 在庫数 /td td bgcolor="#ffffff" width="557" class="fs12n" !--{if $arrForm.stock_unlimited == 1}-- 無制限 !--{else}-- !--{$arrForm.stock|escape}-- 個 !--{/if}-- /td /tr !--{/if}-- !-- ▼送料カスタマイズ -- tr th 商品送料 /th td !--{$arrForm.deliv_fee|escape}-- 円 /td /tr !-- ▲送料カスタマイズ -- 商品画面。 /data/Smarty/templates/default/admin/products/product.tpl 「* 送料の個別指定は次期開発で追加予定 」のところを次期開発を待たずにカスタマイズしてやる。 $arrForm.stock_unlimited == "1"}-- checked !--{/if}-- onclick="fnCheckStockLimit( !--{$smarty.const.DISABLED_RGB}-- );"/ 無制限 /td /td /tr !--{/if}-- tr class="fs12n" td bgcolor="#f2f1ec" width="160" 商品送料 /td td bgcolor="#ffffff" width="557" span class="red12" !--{$arrErr.deliv_fee}-- /span input type="text" name="deliv_fee" value=" !--{$arrForm.deliv_fee|escape}-- " size="6" class="box6" maxlength=" !--{$smarty.const.PRICE_LEN}-- " style=" !--{if $arrErr.deliv_fee != ""}-- background-color !--{$smarty.const.ERR_COLOR}-- !--{/if}-- "/ 円 span class="red10" (半角数字で入力) /span /td !--{if $smarty.const.OPTION_PRODUCT_DELIV_FEE != 1}-- br / span class="attention" ※現在無効です /span (パラメータ OPTION_PRODUCT_DELIV_FEE) !--{/if}-- /td /tr 続いてロジックの修正 /data/class/SC_CartSession.php Line348のgetAllProductsDelivFeeメソッドをコメントアウト。削除でもいいけど。 /*** コメントアウト @送料拡張用 2009.05.07 // 全商品の合計送料 function getAllProductsDelivFee() { // ポイント合計 $total = 0; $max = $this- getMax(); for($i = 0; $i = $max; $i++) { $deliv_fee = $_SESSION[$this- key][$i][ deliv_fee ]; $quantity = $_SESSION[$this- key][$i][ quantity ]; $total+= ($deliv_fee * $quantity); } return $total; }**/ /data/class/helper/SC_Helper_DB.php Line1420のsfTotalConfirm()メソッドの中を修正。 Line14391~ // 商品ごとの送料が有効の場合 if (OPTION_PRODUCT_DELIV_FEE == 1) { // $arrData[ deliv_fee ]+= $objCartSess- getAllProductsDelivFee(); // 全商品の合計数量を算出する @送料カスタマイズ 2009.05.07 $this- lfAddAllProductsDelivFee($arrData, $objPage, $objCartSess); } Line1446~ // 配送業者の送料が有効の場合 if (OPTION_DELIV_FEE == 1) { // 送料の合計を計算する //$arrData[ deliv_fee ] // += $this- sfGetDelivFee($arrData[ deliv_pref ], // $arrData[ payment_id ]); // 都道府県、支払方法から配送料金を加算する @送料カスタマイズ 2009.05.07 $this- lfAddDelivFee($arrData); } ファイルの最後にメソッドを3つ追加。 /*** * 全商品の合計数量を加算する * @送料カスタマイズ 2009.05.07 * @author y-nakajima ***/ function lfAddAllProductsDelivFee( $arrData, $objPage, $objCartSess) { $arrData[ deliv_fee ] += $this- lfCalcAllProductsDelivFee($arrData, $objCartSess); } /*** * 全商品の合計送料を加算する * @送料カスタマイズ 2009.05.07 * @author y-nakajima * @return 全商品の合計送料 ***/ function lfCalcAllProductsDelivFee( $arrData, $objCartSess){ $objQuery = new SC_Query(); $deliv_fee_total = 0; $max = $objQuery- getMax(); for($i = 0; $i = $max; $i++){ // 商品送料 $deliv_fee = $objQuery- getOne( SELECT deliv_fee FROM dtb_products WHERE product_id = ? , array($_SESSION[$objCartSess- key][$i][ id ][0])); // 数量 $quantity = $_SESSION[$objCartSess- key][$i][ quantity ]; // 累積 $deliv_fee_total += $deliv_fee * $quantity; } return $deliv_fee_total; } /*** * 都道府県、支払方法から配送料金を加算する * @送料カスタマイズ 2009.05.07 * @author y-nakajima ***/ function lfAddDelivFee( $arrData){ $arrData[ deliv_fee ] += $this- sfGetDelivFee($arrRet); } これでいいはず。
https://w.atwiki.jp/lucier/pages/15.html
モバイルでもポイントを利用した決済ができるようにします。 画面イメージ まずはテンプレート。配達日時指定画面 /data/Smarty/templates/default/mobile/shopping/deliv_date.tpl の33~35行目あたりを以下に変更。 !-- ▼mobileポイント利用 -- !--{if $tpl_login == 1}-- ■ポイント利用 br / 現在の所持ポイントは「 font color="red" !--{$tpl_user_point|default 0}-- /font pt」です。 br / 使用するポイントをご記入ください。ポイントを使用しない場合は「0」とご入力ください。 br / ※所持ポイント以上のポイントはご利用いただけません。 br / input type="hidden" name="point_check" value="1" / input type="text" name="use_point" istyle="4" / !--{/if}-- br/ br/ !-- ▲mobileポイント利用 -- 続いてご注文内容確認画面。 /data/Smarty/templates/default/mobile/shopping/confirm.tpl の69行目あたりを編集。 ※表現「商品合計」を「小計」に統一し、「円」を表示するようにしました。 小計: !--{$tpl_total_pretax|number_format}-- 円(内消費税: !--{$arrData.tax|number_format}-- 円) br 値引き(ポイントご使用時): !--{assign var=discount value=`$arrData.use_point*$smarty.const.POINT_VALUE`}-- !--{$discount|number_format|default 0}-- 円 br 送料: !--{$arrData.deliv_fee|number_format}-- 円 br !--{if $arrData.charge 0}-- 手数料: !--{$arrData.charge|number_format}-- 円 br !--{/if}-- 合計: font color="red" !--{$arrData.payment_total|number_format}-- 円 /font br br 【ポイント】 br ご注文前のポイント !--{$tpl_user_point|number_format|default 0}-- pt br / ご使用ポイント - !--{$arrData.use_point|number_format|default 0}-- pt br / !--{if $arrData.birth_point 0}-- お誕生月ポイント + !--{$arrData.birth_point|number_format|default 0}-- pt br / !--{/if}-- 今回加算されるポイント + !--{$arrData.add_point|number_format|default 0}-- pt br / !--{assign var=total_point value=`$tpl_user_point-$arrData.use_point+$arrData.add_point`}-- ご注文完了後のポイント !--{$total_point|number_format}-- pt br / 続いて、かご表示画面。 /data/Smarty/templates/default/mobile/cart/index.tpl の63~68行目を以下の通り編集する。 ※表現「商品合計」を「小計」に統一し、「円」を表示するようにしました。 小計 !--{$tpl_total_pretax|number_format}-- 円 br 合計 font color="red" !--{$arrData.total-$arrData.deliv_fee|number_format}-- 円 /font br !--{if $arrData.birth_point 0}-- お誕生月ポイント !--{$arrData.birth_point|number_format}-- pt br !--{/if}-- 今回加算ポイント !--{$arrData.add_point|number_format}-- pt br 続いて、購入履歴詳細画面。 /data/Smarty/templates/default/mobile/mypage/history_detail.tpl の56~58行目を以下の通り編集する。 ※表現「商品合計」を「小計」に統一、「Pt」を「pt」に統一しました。 小計 !--{$arrDisp.subtotal|number_format}-- 円 br !-- 使用ポイントここから -- !--{assign var=point_discount value="`$arrDisp.use_point*$smarty.const.POINT_VALUE`"}-- !--{if $point_discount 0}-- ポイント値引き !--{$point_discount|number_format}-- 円 br !--{/if}-- !--{assign var=key value="discount"}-- !--{if $arrDisp[$key] != "" $arrDisp[$key] 0}-- 値引き !--{$arrDisp[$key]|number_format}-- 円 br !--{/if}-- !-- 使用ポイントここまで -- 送料 !--{assign var=key value="deliv_fee"}-- !--{$arrDisp[$key]|escape|number_format}-- 円 br 手数料 !--{assign var=key value="charge"}-- !--{$arrDisp[$key]|escape|number_format}-- 円 br 合計 font color="red" !--{$arrDisp.payment_total|number_format}-- 円 /font br br !-- 使用ポイントここから -- ご使用ポイント !--{assign var=key value="use_point"}-- !--{$arrDisp[$key]|number_format|default 0}-- pt br 今回加算されるポイント !--{$arrDisp.add_point|number_format|default 0}-- pt br !-- 使用ポイントここまで -- 続いて、商品詳細画面。 /data/Smarty/templates/default/mobile/products/detail.tpl の42~58目を以下の通り編集する。 !--★価格★-- 販売価格(税込) font color="#FF0000" !--{if $arrProduct.price02_min == $arrProduct.price02_max}-- !--{$arrProduct.price02_min|sfPreTax $arrSiteInfo.tax $arrSiteInfo.tax_rule|number_format}-- !--{else}-- !--{$arrProduct.price02_min|sfPreTax $arrSiteInfo.tax $arrSiteInfo.tax_rule|number_format}-- ・ !--{$arrProduct.price02_max|sfPreTax $arrSiteInfo.tax $arrSiteInfo.tax_rule|number_format}-- !--{/if}-- 円 /font br/ !--{if $arrProduct.price01_max 0}-- font color="#FF0000" 通常価格 !--{if $arrProduct.price01_min == $arrProduct.price01_max}-- !--{$arrProduct.price01_min|number_format}-- !--{else}-- !--{$arrProduct.price01_min|number_format}-- ・ !--{$arrProduct.price01_max|number_format}-- !--{/if}-- 円 /font br !--{/if}-- !--★ポイント★-- font color="#FF0000" ポイント: !--{if $arrProduct.price02_min == $arrProduct.price02_max}-- !--{$arrProduct.price02_min|sfPrePoint $arrProduct.point_rate $smarty.const.POINT_RULE $arrProduct.product_id}-- !--{else}-- !--{if $arrProduct.price02_min|sfPrePoint $arrProduct.point_rate $smarty.const.POINT_RULE $arrProduct.product_id == $arrProduct.price02_max|sfPrePoint $arrProduct.point_rate $smarty.const.POINT_RULE $arrProduct.product_id}-- !--{$arrProduct.price02_min|sfPrePoint $arrProduct.point_rate $smarty.const.POINT_RULE $arrProduct.product_id}-- !--{else}-- !--{$arrProduct.price02_min|sfPrePoint $arrProduct.point_rate $smarty.const.POINT_RULE $arrProduct.product_id}-- ? !--{$arrProduct.price02_max|sfPrePoint $arrProduct.point_rate $smarty.const.POINT_RULE $arrProduct.product_id}-- !--{/if}-- !--{/if}-- pt /font br/ br/ これでモバイルでもポイントが利用できるようになる。